/**
 * 
 */
package com.smarthome.common.tools;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.smarthome.domain.vo.boss.Tree;

/**
 * @Title 树转换工具类
 * @author dhc
 * @date 2014年8月20日 下午12:37:04
 */
public class TreeUtil {
	
	/**
	 * @Title 转换树
	 * @Date 2014年8月20日
	 * @param tree 待转换的更节点
	 * @param pid 为传入的跟节点的父， 如果pid 为null 找节点为空的做为节点
	 */
	public static List<Tree> converttree(List<Tree> tree, Long pid){
		List<Tree> root = new ArrayList<Tree>();
		
		if(null == tree || tree.size() == 0){
			return root;
		}
		
		for(int i=(tree.size()-1) ; i>=0 ;i--){ 
			Tree vo = tree.get(i);
			if(pid != null && pid.equals(vo.getPid())){
				tree.remove(vo);
				try{
					
					root.add(sorttree(vo,tree));
				} catch(Exception e){
					e.printStackTrace();
				}
			} else if(vo.getPid() == null && pid != null ){
				tree.remove(vo);
			} else 	if(null == vo.getPid()){
				tree.remove(vo);
				root.add(sorttree(vo,tree));
			}
		}
		
		
		
		return root;
	}
	
	/***
	 * @Title 过滤树 只保留传入的的Id 及其父类Id
	 * @Date 2015年9月18日
	 */
	public static List<Tree> filtertree(List<Tree> trees, List<String> filterIds){
		if(null == filterIds && filterIds.size() ==0){
			return trees;
		}
		Set<Tree> set = new HashSet<Tree>();		
		
		for(String idstr : filterIds){
			try{
				Long id = new Long(idstr);
				if(null == id) continue; 
				for(int i = trees.size()-1; i>=0 ; i--){
					Tree vo = trees.get(i);
					if(id.equals(vo.getId())){
						set.add(vo);
						fileterParent(trees,set,id);
					}
				}
			} catch(Exception e){}
		}
		
		
		List<Tree> ts = new ArrayList<Tree>();
		ts.addAll(set);
		return ts;
	}
	
	/***
	 * @Title 树转换list
	 * @Date 2015年9月18日
	 */
	public static List<Tree> tree2list(List<Tree> roots){
		List<Tree> renList = new ArrayList<Tree>();
		turnList(renList,roots);
		return renList;
	}
	
	private static void turnList(List<Tree> target,List<Tree> source){
		if(null == target){
			target = new ArrayList<Tree>();
		}
		if(null == source){
			return ;
		}
		for(Tree vo : source){
			target.add(vo);
			turnList(target, vo.getChildren());
		}
	}
	
	/**过滤父类*/
	private static void fileterParent(List<Tree> sourece,Set<Tree> target,Long pid){
		if(null != sourece && null != pid){
			for(int i=sourece.size()-1; i>=0 ; i--){
				Tree vo = sourece.get(i);
				if(pid.equals(vo.getId())){
					target.add(vo);
					fileterParent(sourece, target, vo.getPid());
					sourece.remove(i);
					return ;
				}
			}
		}
	}
	
	
	private static Tree sorttree(Tree rootVO, List<Tree> tree){
		
		if(null == tree || tree.size() == 0){
			return rootVO;
		}
		
		for(Tree vo : tree){
			
			if(rootVO.getId().equals(vo.getPid())){
				if(null == rootVO.getChildren()){
					rootVO.setChildren( new ArrayList<Tree>());
				}
				rootVO.getChildren().add(sorttree(vo, tree));
			}
		}
		
		return rootVO;
	}

}
